package cn.itcast.nems.payment.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 学员支付
 *
 * @author liyong
 * @since 2024-03-22
 */
@Data
public class StudentPaidDTO {
    /**
     * 学员ID
     */
    @Min(value = 1, message = "学员ID不正确")
    private int studentId;

    /**
     * 班级ID
     */
    @Min(value = 1, message = "班级ID不正确")
    private int clazzId;

    /**
     * 日记账表ID（journal.id）
     */
    @Min(value = 1, message = "日记账ID不正确")
    private int journalId;

    /**
     * 实际收支的发生日期
     */
    @NotNull(message = "支付时间不能为空！")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime paidDatetime;

    /**
     * 支付类型;枚举值：在线支付|ONLINE_PAY、离线支付｜OFFLINE_PAY、退费｜REFUND
     */
    @NotNull(message = "支付类型不能为空！")
    private String paymentType;

    /**
     * 支付单号;根据凭单类型不同。如果是在线支付则为支付平台内的支付子单号。如果是离线支付则为离线支付单行ID。
     */
    @NotNull(message = "支付单号不能为空！")
    private String paymentNo;

    /**
     * 发生金额;本次发生金额：支付为正，退费为负。单位：分
     */
    @NotNull(message = "支付金额不能为空！")
    private Integer amount;

    /**
     * 支付手续费;手续费：amount*charge_rata/100。单位：分。注：目前只有支付会存在费用。
     */
    private Integer charge;

    /**
     * 手续费费率。和渠道方确定。
     */
    private Integer chargeRate;

    /**
     * 支付方式
     */
    @NotNull(message = "支付方式不能为空！")
    private String paymentMethodCode;

    /**
     * 支付方式名称
     */
    @NotNull(message = "支付方式名称不能为空！")
    private String paymentMethodName;

    /**
     * 支付渠道账号
     */
    private String paymentAccountCode;

    /**
     * 支付渠道账号名称
     */
    private String paymentAccountName;

    /**
     * 备注
     */
    private String remark;
}
